#ifndef _META_SINGLETON_H_
#define _META_SINGLETON_H_

#include <algorithm>
#include <stdexcept>
#include <cassert>
#include <cstdlib>
#include <new>
#include <vector>
#include <list>
#include <memory>

namespace Maha
{
      namespace Meta
      {

      template <class T> 
      class Singleton
      {
      public:

            static T& GetInstance()
            {
                  if (!self)
                        self = new T();

                  return *self;
            }

      //private:

            Singleton() {}

      private:

            static T* self;
      };

      template <class T>
      T* Singleton<T>::self = 0;

      } // Meta
} // Maha

#endif // _META_SINGLETON_H_
